"""
计算IoU,矩形框的坐标形式为xyxy,这个函数会被保存在box_utils.py文件中
"""
import numpy as np


def box_iou_xyxy(box1,box2):
    # 获取box1左上角和右下角的坐标
    x1min,y1min,x1max,y1max=box1[0],box1[1],box1[2],box1[3]
    # 计算box1的面积
    s1 = (y1max - y1min + 1.) * (x1max - x1min + 1.)
    # 获取box2左上角和右下角的坐标
    x2min,y2min,x2max,y2max = box2[0],box2[1],box2[2],box2[3]
    # 计算box2的面积
    s2 = (y2max - y2min + 1.) * (x2max - x2min + 1.)

    # 计算相交矩形框的坐标
    xmin = np.maximum(x1min,x2min)
    ymin = np.maximum(y1min,y2min)
    xmax = np.minimum(x1max,x2max)
    ymax = np.minimum(y1max,y2max)
    # 计算相交矩形的高度、宽度、面积
    inter_h = np.maximum(ymax - ymin, 0.)
    inter_w = np.maximum(xmax - xmin, 0.)
    intersection = inter_h * inter_w

    union = s1 + s2 - intersection
    iou = intersection / union
    return iou

def box_iou_xywh(box1,box2):
    x1min,y1min = box1[0] - box1[2]/2.0,box1[1] - box1[3]/2.0
    x1max,y1max = box1[0] + box1[2]/2.0,box1[1] + box1[3]/2.0
    s1 = box1[2] * box1[3]

    x2min, y2min = box2[0] - box2[2]/2.0, box2[1] - box2[3]/2.0
    x2max, y2max = box2[0] + box2[2]/2.0, box2[1] + box2[3]/2.0
    s2 = box2[2] * box2[3]

    xmin = np.maximum(x1min,x2min)
    ymin = np.maximum(y1min,y2min)
    xmax = np.minimum(x1max,x2max)
    ymax = np.minimum(y1max,y2max)
    inter_h = np.maximum(ymax - ymin,0.)
    inter_w = np.maximum(xmax - xmin,0.)
    intersection = inter_h * inter_w

    union = s1 + s2 - intersection
    iou = intersection / union
    return iou

bbox1 = [100.,100.,200.,200.]
bbox2 = [120.,120.,220.,220.]
iou = box_iou_xyxy(bbox1,bbox2)
print('IoU is {}'.format(iou))

iou2 = box_iou_xywh(bbox1,bbox2)
print('IoU2 is {}'.format(iou2))
